#pragma once

//////////////////////////////////////////////////
//ListElement
//////////////////////////////////////////////////

template <class Type> class ListElement
  {

  public:
	  ListElement(Type* i_data);
	  virtual ~ListElement(void);

  private:
    Type* m_data;
    ListElement<Type>* m_prev_list_element;
    ListElement<Type>* m_next_list_element;    

  public:
    Type* GetData() const;
    ListElement<Type>* GetPrevListElement() const;        
    ListElement<Type>* GetNextListElement() const;

    void SetData(Type* i_data);
    void SetPrevListElement(ListElement<Type>* i_prev_list_element);
    void SetNextListElement(ListElement<Type>* i_next_list_element);

  };

//////////////////////////////////////////////////

//////////////////////////////////////////////////
//ListElement
//////////////////////////////////////////////////

//------------------------------------------------

template <class Type> ListElement<Type>::ListElement(Type* i_data) 
: m_data(i_data)
, m_prev_list_element(NULL)
, m_next_list_element(NULL)
  {
  }

//------------------------------------------------

template <class Type> ListElement<Type>::~ListElement(void)
  {
  delete m_data;

  if(m_prev_list_element)
    {
    m_prev_list_element->SetNextListElement(m_next_list_element);
    }

  if(m_next_list_element)
    {
    m_next_list_element->SetPrevListElement(m_prev_list_element);
    }

  m_prev_list_element = NULL;
  m_next_list_element = NULL;
  }

//------------------------------------------------

template <class Type> Type* ListElement<Type>::GetData() const
  {
  return m_data;
  }

//------------------------------------------------

template <class Type> ListElement<Type>* ListElement<Type>::GetPrevListElement() const
  {
  return m_prev_list_element;
  }

//------------------------------------------------

template <class Type> ListElement<Type>* ListElement<Type>::GetNextListElement() const
  {
  return m_next_list_element;
  }

//------------------------------------------------

template <class Type> void ListElement<Type>::SetData(Type* i_data)
  {
  m_data = i_data;
  }

//------------------------------------------------

template <class Type> void ListElement<Type>::SetPrevListElement(ListElement<Type>* i_prev_list_element)
  {
  m_prev_list_element = i_prev_list_element;
  }

//------------------------------------------------

template <class Type> void ListElement<Type>::SetNextListElement(ListElement<Type>* i_next_list_element)
  {
  m_next_list_element = i_next_list_element;
  }

//------------------------------------------------

//////////////////////////////////////////////////